package Connector;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Map;
import javax.servlet.*;

// 为了支持动态资源，实现ServletRequest接口，HttpServletRequest也可以
public class Request implements ServletRequest {
// TODO 尝试使用HttpServletRequest

    private static final int BUFFER_SIZE = 1024;
    // 试试改buffer size的大小，看看会发生什么。

    // socket的输入
    private InputStream input;
    // TODO 什么时候使用inputStream??
        // 所有的文件归根结底都是二进制的，都可以使用字节流；
        // 这里只是一个引用；创建实例的时候用具体的类；


    // 用来存储URI
    private String URI;

    // 构造函数
    // generator的快捷键：alt + insert
    public Request(InputStream input) {
        this.input = input;
    }

    // 从request得到URI
    public String getRequestURI() {
        return URI;
    }

    // 解析request生成URI； 注意：生成URI和返回URI是分开的
    // 不是生成请求行，请求行在input里面；
    public void parse(){

        System.out.println("Request is transferring InputStream into String to get URI...");

        // length用于将byte[] = char[]拼接为String
        int length = 0;

        byte[] buffer = new byte[BUFFER_SIZE];

        try {
            length = input.read(buffer);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // StringBuilder类才能拼接
        StringBuilder request = new StringBuilder();

        for (int i = 0; i < length; i++) {
            request.append((char)buffer[i]);
        }

        // StringBuilder要转换成String再调用parseURI()
        URI = parseURI(request.toString());
        // TODO 不需要对象来调用??
            // 同一个类的一个方法调用另一个方法时，如果被调用方法是普通方法，则默认使用this作为调用者；
            // 如果被调用方法时静态方法，则默认使用类作为调用者。

        System.out.println("Request generate URI successfully. The URI:" + URI + " is available.");
    }

    private String parseURI(String request){
        System.out.println("Request is parsing String to get URI...");

        int index1, index2 = 0;

        index1 = request.indexOf(' ');
        // 如果出错了会返回-1

        if (index1 != -1) {
            index2 = request.indexOf(' ', index1 + 1);
            // 从哪个位置开始寻找

            if (index2 > index1){   // index2 != -1
                return request.substring(index1 + 1, index2);
            }
        }

        return " ";
    }

    @Override
    public Object getAttribute(String s) {
        return null;
    }

    @Override
    public Enumeration<String> getAttributeNames() {
        return null;
    }

    @Override
    public String getCharacterEncoding() {
        return null;
    }

    @Override
    public void setCharacterEncoding(String s) throws UnsupportedEncodingException {

    }

    @Override
    public int getContentLength() {
        return 0;
    }

    @Override
    public String getContentType() {
        return null;
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        return null;
    }

    @Override
    public String getParameter(String s) {
        return null;
    }

    @Override
    public Enumeration<String> getParameterNames() {
        return null;
    }

    @Override
    public String[] getParameterValues(String s) {
        return new String[0];
    }

    @Override
    public Map<String, String[]> getParameterMap() {
        return null;
    }

    @Override
    public String getProtocol() {
        return null;
    }

    @Override
    public String getScheme() {
        return null;
    }

    @Override
    public String getServerName() {
        return null;
    }

    @Override
    public int getServerPort() {
        return 0;
    }

    @Override
    public BufferedReader getReader() throws IOException {
        return null;
    }

    @Override
    public String getRemoteAddr() {
        return null;
    }

    @Override
    public String getRemoteHost() {
        return null;
    }

    @Override
    public void setAttribute(String s, Object o) {

    }

    @Override
    public void removeAttribute(String s) {

    }

    @Override
    public Locale getLocale() {
        return null;
    }

    @Override
    public Enumeration<Locale> getLocales() {
        return null;
    }

    @Override
    public boolean isSecure() {
        return false;
    }

    @Override
    public RequestDispatcher getRequestDispatcher(String s) {
        return null;
    }

    @Override
    public String getRealPath(String s) {
        return null;
    }

    @Override
    public int getRemotePort() {
        return 0;
    }

    @Override
    public String getLocalName() {
        return null;
    }

    @Override
    public String getLocalAddr() {
        return null;
    }

    @Override
    public int getLocalPort() {
        return 0;
    }

    @Override
    public ServletContext getServletContext() {
        return null;
    }

    @Override
    public AsyncContext startAsync() throws IllegalStateException {
        return null;
    }

    @Override
    public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException {
        return null;
    }

    @Override
    public boolean isAsyncStarted() {
        return false;
    }

    @Override
    public boolean isAsyncSupported() {
        return false;
    }

    @Override
    public AsyncContext getAsyncContext() {
        return null;
    }

    @Override
    public DispatcherType getDispatcherType() {
        return null;
    }
}
